using MongoDB.Driver;

namespace sgf.server
{
    public class MongoClient
    {
        private readonly IMongoDatabase _database;

        public MongoClient(string url, string databaseName)
        {
            // 创建MongoClient实例
            var client = new MongoDB.Driver.MongoClient(url);

            // 连接到数据库
            _database = client.GetDatabase(databaseName);
        }

        // 增（Insert）

        // insert(): 插入一个或多个文档。
        public void Insert<T>(T document) where T : Entity
        {
            var collection = _database.GetCollection<T>(document.GetType().Name);
            collection.InsertOne(document);
        }

        // insertOne(): 插入单个文档。
        public void InsertOne<T>(T document)
        {
            var collection = _database.GetCollection<T>(document.GetType().Name);
            collection.InsertOne(document);
        }

        // insertMany(): 插入多个文档。
        public void InsertMany<T>(List<T> documents)
        {
            if (documents.Count == 0) return;
            var collection = _database.GetCollection<T>(documents[0].GetType().Name);
            collection.InsertMany(documents);
        }

        // // 删（Delete）
        // // remove(): 删除匹配查询条件的文档。
        // public void Remove<T>(FilterDefinition<T> filter)
        // {
        //     var collection = _database.GetCollection<T>(document.GetType().Name);
        //     collection.DeleteMany(filter);
        // }
        //
        // // deleteOne(): 删除匹配查询条件的第一个文档。
        // public void DeleteOne<T>(FilterDefinition<T> filter)
        // {
        //     var collection = _database.GetCollection<T>(document.GetType().Name);
        //     collection.DeleteOne(filter);
        // }
        //
        // // deleteMany() : 删除所有匹配查询条件的文档。
        // public void DeleteMany<T>(FilterDefinition<T> filter)
        // {
        //     var collection = _database.GetCollection<T>(document.GetType().Name);
        //     collection.DeleteMany(filter);
        // }

        // // 改（Update）
        // // update() : 更新匹配查询条件的文档。
        // public void Update<T>(FilterDefinition<T> filter, UpdateDefinition<T> update)
        // {
        //     var collection = _database.GetCollection<T>(document.GetType().Name);
        //     collection.UpdateMany(filter, update);
        // }
        //
        // // updateOne() : 更新匹配查询条件的第一个文档。
        // public void UpdateOne<T>(FilterDefinition<T> filter, UpdateDefinition<T> update)
        // {
        //     var collection = _database.GetCollection<T>(document.GetType().Name);
        //     collection.UpdateOne(filter, update);
        // }
        //
        // // updateMany() : 更新所有匹配查询条件的文档。
        // public void UpdateMany<T>(FilterDefinition<T> filter, UpdateDefinition<T> update)
        // {
        //     var collection = _database.GetCollection<T>(document.GetType().Name);
        //     collection.UpdateMany(filter, update);
        // }

        // 查（Query）
        // find() : 查询集合中的文档。
        public List<T> Find<T>(string doc, FilterDefinition<T> filter)
        {
            var collection = _database.GetCollection<T>(doc);
            return collection.Find(filter).ToList();
        }

        // findOne() : 查询集合中匹配条件的第一个文档。
        public T FindOne<T>(string doc, FilterDefinition<T> filter)
        {
            var collection = _database.GetCollection<T>(doc);
            return collection.Find(filter).FirstOrDefault();
        }
    }
}